#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/time.h> 

/*
 * 每隔一秒发出一个SIGALRM，每隔0.5秒发出一个SIGVTALRM信号
 *
 * 在setitimer 调用中，参数ovalue如果不为空，则其中保留的是上次调用设定的值。定时器将it_value递减到0时，产生一个信号，
 * 并将it_value的值设 定为it_interval的值，然后重新开始计时，如此往复。当it_value设定为0时，计时器停止，或者当它计时到期，
 * 而it_interval 为0时停止。调用成功时，返回0；错误时，返回-1，并设置相应的错误代码errno： 
 */

int sec; 

void sigroutine(int signo) { 
  switch (signo) { 
  case SIGALRM: 
    printf("Catch a signal -- SIGALRM "); 
    break; 
  case SIGVTALRM: 
    printf("Catch a signal -- SIGVTALRM "); 
    break; 
  } 
  return; 
} 

int main() { 
  struct itimerval value,ovalue,value2; 
  sec = 5; 

  printf("process id is %d ",getpid()); 
  signal(SIGALRM, sigroutine); 
  signal(SIGVTALRM, sigroutine); 

  value.it_value.tv_sec = 1; 
  value.it_value.tv_usec = 0; 
  value.it_interval.tv_sec = 1; 
  value.it_interval.tv_usec = 0; 
  setitimer(ITIMER_REAL, &value, &ovalue); 

  value2.it_value.tv_sec = 0; 
  value2.it_value.tv_usec = 500000; 
  value2.it_interval.tv_sec = 0; 
  value2.it_interval.tv_usec = 500000; 
  setitimer(ITIMER_VIRTUAL, &value2, &ovalue); 

  for (;;) ; 
} 
